package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.constant.MessageConst;
import com.itheima.dao.MemberDao;
import com.itheima.dao.OrderDao;
import com.itheima.dao.OrderSettingDao;
import com.itheima.entity.Result;
import com.itheima.pojo.Member;
import com.itheima.pojo.Order;
import com.itheima.pojo.OrderSetting;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    OrderSettingDao orderSettingDao;

    @Autowired
    MemberDao memberDao;

    @Autowired
    OrderDao orderDao;

    /**
     * 步骤：
     *      1. 判断是否进行了预约设置， 如果没有设置，提示不能预约
     *      2. 是否预约已满（已预约大于等于可预约），如果预约已满，提示不能预约
     *      3. 根据手机号确认是否是会员
     *          如果不是会员，自动注册
     *          如果是会员， 判断是否重复预约（同一个人预约同一时间同一个套餐）， 如果重复预约，提示不能预约
     *      4. 开始预约（insert）
     *      5. 修改预约设置，已预约人数加一
     * @param map
     * @return
     */
    @Override
    public Result addOrder(Map<String, Object> map) throws ParseException {
        //获取手机号码
        String telephone = String.valueOf(map.get("telephone"));
        //获取要预约的日期
        String orderDateStr = String.valueOf(map.get("orderDate"));
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date orderDate =  dateFormat.parse(orderDateStr);
        //获取姓名
        String name = String.valueOf(map.get("name"));
        //获取适用性别
        String sex = String.valueOf(map.get("sex"));
        //获取身份证号码
        String idCard = String.valueOf(map.get("idCard"));
        //获取套餐id
        Integer setmealId = Integer.parseInt(String.valueOf(map.get("setmealId")));
        //获取预约类型
        String orderType = String.valueOf(map.get("orderType"));

//        1. 判断是否进行了预约设置， 如果没有设置，提示不能预约

        //根据日期查询预约设置对象
        OrderSetting orderSettingDB = orderSettingDao.findByOrderDate(orderDateStr);
        //判断是否进行了预约设置
        if(orderSettingDB == null){
            return new Result(false, MessageConst.SELECTED_DATE_CANNOT_ORDER);
        }
//        2. 是否预约已满（已预约大于等于可预约），如果预约已满，提示不能预约
        //如果可预约大于已预约，说明预约已满
        if(orderSettingDB.getNumber() <= orderSettingDB.getReservations()){
            return new Result(false, MessageConst.ORDER_FULL);
        }
//        3. 根据手机号确认是否是会员
        Member member = memberDao.findByTelephone(telephone);
        //如果是会员： 如果是会员
        if(member != null){
            //判断是否重复预约（同一个人预约同一时间同一个套餐）， 如果重复预约，提示不能预约
            // 同一个人(member.getId())  同一时间(orderDate) 同一套餐(setmealId)
            Order order = new Order();
            order.setSetmealId(setmealId);
            order.setMemberId(member.getId());

            order.setOrderDate(orderDate);

            //查询预约对象
            long count = orderDao.findByOrder(order);
            if(count > 0){
                return new Result(false,MessageConst.HAS_ORDERED);
            }
        }
        //如果不是会员, 自动注册
        else{
            //自动注册
            member = new Member();
            //给会员对象赋值
            member.setRegTime(new Date());
            member.setPhoneNumber(telephone);
            member.setName(name);
            member.setSex(sex);
            member.setIdCard(idCard);
            //添加到数据(主键回显)
            memberDao.add(member);
        }
//        4. 开始预约（insert）
        Order order = new Order();
        order.setMemberId(member.getId());
        order.setOrderDate(orderDate);
        order.setOrderType(orderType);
        order.setOrderStatus(Order.ORDERSTATUS_NO);
        order.setSetmealId(setmealId);
        //添加预约信息到数据
        orderDao.add(order);

//        5. 修改预约设置，已预约人数加一
        orderSettingDB.setReservations(orderSettingDB.getReservations() + 1);
        orderSettingDao.edit(orderSettingDB);

        return new Result(true,MessageConst.ORDER_SUCCESS, order);
    }

    @Override
    public Map<String, Object> findById(Integer id) {
        return orderDao.findById(id);
    }
}
